\begin{Exercise}[title={字符串},difficulty=1]
\label{ex:strings}
\Question \label{ex:strings q1} 建立一个~Go 程序打印下面的内容（到~100 个字符）：
\vskip\baselineskip
\begin{display}
A
AA
AAA
AAAA
AAAAA
AAAAAA
AAAAAAA
...
\end{display}
\vskip\baselineskip

\Question \label{ex:strings q2} 建立一个程序统计字符串里的字符数量：
\begin{display}
asSASA ddd dsjkdsjs dk
\end{display}
同时输出这个字符串的字节数。
\emph{提示：} 看看~\package{unicode/utf8} 包。

\Question \label{ex:string q3} 扩展/修改上一个问题的程序，替换位置~4 开始的三个字符为~``abc''。

\Question \label{ex:string q4} 编写一个~Go 程序可以逆转字符串，例如``foobar''
被打印成``raboof''。
\emph{提示：}不幸的是你需要知道一些关于转换的内容，
参阅``\titleref{sec:conversions}''第~\pageref{sec:conversions} 页的内容。

\end{Exercise}

\begin{Answer}

\Question 这是一个解法：

\lstinputlisting[label=string1,caption=字符串]{ex-basics/src/string1.go}

\Question 为了解决这个问题，需要~\package{unicode/utf8} 包的帮助。
首先，阅读一下文档~\prog{godoc unicode/utf8 | less}。在阅读文档的时候，会注意到
\lstinline{func RuneCount(p []byte) int}。然后，将~
\emph{string} 转换为~\type{byte} slice：
\begin{lstlisting}
str := "hello"
b   := []byte(str) |\coderemark{转换，参阅第~\pageref{sec:conversions} 页}|
\end{lstlisting}

将这些整合到一起，得到下面的程序。

\begin{minipage}{\textwidth}
\lstinputlisting[label=src:string2,caption=字符串中的 rune]{ex-basics/src/string2.go}
\end{minipage}

\Question 如下几行代码：
\begin{minipage}{\textwidth}
\lstinputlisting[label=src:string3]{ex-basics/src/string3.go}
\end{minipage}

\Question 可以用下面的方法逆转字符串。我们从左边（\var{i}）至右（\var{j}）的交换字符，就像这样：

\begin{minipage}{\textwidth}
\lstinputlisting[label=src:stringrev,caption=Reverse a string,linerange={3,}]{ex-basics/src/stringrev.go}
\end{minipage}

\end{Answer}
